package com.kx.game.center.utils;


import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.genchance.core.dawn.util.StringUtils;

import java.util.*;

public class JsonUtils {

    public static String strMapToJsonObjectStr(Map<String, Object> map) {
        JSONObject jsonObject = new JSONObject();
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            jsonObject.put(entry.getKey().toString(), entry.getValue());
        }
        return jsonObject.toString();
    }

    public static Map<String, String> jsonObjectStrToMap(JSONObject value) {
        Map<String, String> map = new HashMap<>();
        if (value == null || value.isEmpty()) {
            return map;
        }
        JSONObject jsonObject = value;
        for (String key : jsonObject.keySet()) {
            map.put(key, String.valueOf(jsonObject.get(key)));
        }
        return map;
    }

    public static String[] jsonObjectStrToArray(JSONObject value) {
        List<String> list = new ArrayList<>();
        JSONObject jsonObject = value;
        for (String key : jsonObject.keySet()) {
            list.add(key + ":" + String.valueOf(jsonObject.get(key)));
        }
        String[] strings = new String[list.size()];
        return list.toArray(strings);
    }


    public static JSONArray integerListToJsonArray(List<Integer> integerList) {
        JSONArray jsonArray = new JSONArray();
        jsonArray.addAll(integerList);
        return jsonArray;
    }

    public static List<Integer> jsonArrayToIntegerList(JSONArray jsonArray) {
        List<Integer> result = new ArrayList<>();
        for (int i = 0; i < jsonArray.size(); i++) {
            result.add(jsonArray.getInteger(i));
        }
        return result;
    }

    public static JSONArray longListToJsonArray(List<Long> longList) {
        JSONArray jsonArray = new JSONArray();
        jsonArray.addAll(longList);
        return jsonArray;
    }

    public static List<Long> jsonArrayToLongList(JSONArray jsonArray) {
        List<Long> result = new ArrayList<>();
        for (int i = 0; i < jsonArray.size(); i++) {
            result.add(jsonArray.getLong(i));
        }
        return result;
    }

    public static JSONArray integerSetToJsonArray(Set<Integer> integerList) {
        JSONArray jsonArray = new JSONArray();
        jsonArray.addAll(integerList);
        return jsonArray;
    }

    public static Set<Integer> jsonArrayToIntegerSet(JSONArray jsonArray) {
        Set<Integer> result = new HashSet<>();
        for (int i = 0; i < jsonArray.size(); i++) {
            result.add(jsonArray.getInteger(i));
        }
        return result;
    }

    public static JSONArray longSetToJsonArray(Set<Long> longList) {
        JSONArray jsonArray = new JSONArray();
        jsonArray.addAll(longList);
        return jsonArray;
    }

    public static Set<Long> jsonArrayToLongSet(JSONArray jsonArray) {
        Set<Long> result = new HashSet<>();
        for (int i = 0; i < jsonArray.size(); i++) {
            result.add(jsonArray.getLong(i));
        }
        return result;
    }

    public static JSONArray stringListToJsonArray(List<Object> objectList) {
        JSONArray jsonArray = new JSONArray();
        jsonArray.addAll(objectList);
        return jsonArray;
    }

    public static List<String> jsonArrayToStringList(JSONArray jsonArray) {
        List<String> result = new ArrayList<>();
        for (int i = 0; i < jsonArray.size(); i++) {
            result.add(jsonArray.getString(i));
        }
        return result;
    }

    /**
     * 转json string
     */
    public static String numberListToJsonArray(Collection<? extends Number> longList) {
        JSONArray jsonArray = new JSONArray();
        jsonArray.addAll(longList);
        return jsonArray.toString();
    }

    /**
     * 是不是用json的啥啥object那个自带的？
     *
     * @param jsonArray ja
     * @return list of long
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    private static <T extends Number> List<T> jsonArrayToList(String jsonArray, Class<T> clazzT) {
        List<T> result = new ArrayList<>();
        if (!StringUtils.isEmpty(jsonArray)) {
            JSONArray _ja = JSONArray.parseArray(jsonArray);
            for (int i = 0; i < _ja.size(); i++) {
                if (clazzT.isAssignableFrom(Integer.class)) {
                    result.add((T) new Integer(_ja.getInteger(i)));
                } else if (clazzT.isAssignableFrom(Long.class)) {
                    result.add((T) new Long(_ja.getLong(i)));
                }

            }
        }
        return result;
    }

    public static List<Long> jsonArrayToLongList(String applyStr) {
        return jsonArrayToList(applyStr, Long.class);
    }

    public static List<Integer> jsonArrayToIntegerList(String applyStr) {
        return jsonArrayToList(applyStr, Integer.class);
    }

    /**
     * SET 也要一个 是不是用json的啥啥object那个自带的？
     *
     * @param jsonArray ja
     * @return set of T
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    private static <T extends Number> Set<T> jsonArrayToSet(String jsonArray, Class<T> clazzT) {
        Set<T> result = new HashSet<>();
        if (!StringUtils.isEmpty(jsonArray)) {
            JSONArray _ja = JSONArray.parseArray(jsonArray);
            for (int i = 0; i < _ja.size(); i++) {
                if (clazzT.isAssignableFrom(Integer.class)) {
                    result.add((T) new Integer(_ja.getInteger(i)));
                } else if (clazzT.isAssignableFrom(Long.class)) {
                    result.add((T) new Long(_ja.getLong(i)));
                }
            }
        }
        return result;
    }

    public static Set<Long> jsonArrayToLongSet(String applyStr) {
        return jsonArrayToSet(applyStr, Long.class);
    }

    public static Set<Integer> jsonArrayToIntegerSet(String applyStr) {
        return jsonArrayToSet(applyStr, Integer.class);
    }

    /**
     * 名字一个意思
     *
     * @param params string array
     * @return json array string
     */
    public static String stringArrayToJsonArray(String... params) {
        JSONArray ja = new JSONArray();
        for (String p : params) {
            ja.add(p);
        }
        return ja.toString();
    }

    /**
     * 不想空
     */
    public static JSONObject parserJsonObjectNullCreate(String jsonStr) {
        if (StringUtils.isEmpty(jsonStr)) {
            return new JSONObject();
        } else {
            return JSONObject.parseObject(jsonStr);
        }
    }

    /**
     * 不想空
     */
    public static JSONArray parserJsonArrayNullCreate(String jsonStr) {
        if (StringUtils.isEmpty(jsonStr)) {
            return new JSONArray();
        } else {
            return JSONArray.parseArray(jsonStr);
        }
    }

    public static void main(String args[]) {
        ArrayList<Object> objects = new ArrayList<>();
        System.out.println(stringListToJsonArray(objects).toString());
    }


}
